/*
给定一个非空 整数数组，除了某个元素出现一次外，其余每个元素均出现两次。
找出那个只出现一次的元素。
*/
package main

import "fmt"

func findSingleOne(nums []int) int {
	single := 0

	for _, n := range nums {
		single ^= n
	}
	return single
}
func main() {
	nums := []int{3, 3, 4, 5, 5, 99, 77, 99, 77}
	single := findSingleOne(nums)
	fmt.Println("The single one is:", single)
}

/*
hash就是找到一种数据内容和数据存放地址之间的映射关系

参与运算的两个值，如果两个相应bit位相同，则结果为0，否则为1。
即：
　　　 0^0 = 0，
      1^0 = 1，
      0^1 = 1，
      1^1 = 0
按位异或的3个特点:
(1) 0^0=0,0^1=1  0异或任何数＝任何数
(2) 1^0=1,1^1=0  1异或任何数－任何数取反
(3) 任何数异或自己＝把自己置0
按位异或的几个常见用途:
(1) 使某些特定的位翻转
    例如对数10100001的第2位和第3位翻转，则可以将该数与00000110进行按位异或运算。
　　　　　  10100001^00000110 = 10100111

(2) 实现两个值的交换，而不必使用临时变量。
    例如交换两个整数a=10100001，b=00000110的值，可通过下列语句实现：
　　　　a = a^b； 　　//a=10100111
　　　　b = b^a； 　　//b=10100001
　　　　a = a^b； 　　//a=00000110
......
来源：https://www.cnblogs.com/this-543273659/archive/2011/08/30/2159819.html
*/
